package data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import org.hibernate.Session;

import englishChicken.Usuario;

public class JDBCUsuarioDAO implements IUsuarioDAO{
	
	public void delete(String uid) {
		Connection conn = Conexion.getInstance().checkOut();
        String sql = "DELETE FROM Usuario WHERE (UID = ?) ";
        PreparedStatement stmt = null;

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, uid);
            stmt.executeUpdate();
        } catch (SQLException e) {
            System.err.println("Mensaje de error: " + e.getMessage());
            System.err.println("SQLState: " + e.getSQLState());
            System.err.println("Código de error: " + e.getErrorCode());
        } finally {
            try {
                if (stmt != null)
                    stmt.close();
            } catch (SQLException e) {
            }
        }
    }

    public void insert(String uid, Usuario u) {
    	Connection conn = Conexion.getInstance().checkOut();
        String sql = "INSERT INTO Usuario ( UID, nombre, apellidos, fechaNacimiento, sexo, " +
        		"direccion, email, nacionalidad, lat, lon, apodo, pass) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";
        PreparedStatement stmt = null;
        double loc[] = new double[2];
        loc = u.getLocalizacion(); 

        try {
            stmt = conn.prepareStatement(sql);

            stmt.setString(1, uid);
            stmt.setString(2, u.getNombre());
            stmt.setString(3, u.getApellidos());
            stmt.setString(4, u.getFechaNacimiento());
            stmt.setString(5, String.valueOf(u.getSexo()));
            stmt.setString(6, u.getDireccion());
            stmt.setString(7, u.getEmail());
            stmt.setString(8, u.getNacionalidad());
            stmt.setDouble(9, loc[0]);
            stmt.setDouble(10, loc[1]);
            stmt.setString(11, u.getApodo());
            stmt.setString(12, u.getPass());

            stmt.executeUpdate();

        } catch (SQLException e) {
            System.out.println("Mensaje de error: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("Código de error: " + e.getErrorCode());
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }

    }

    public Usuario selectByName(String apodo){
    	return select("apodo",apodo);
    }
    
    public Usuario selectByUID(String uid){
    	return select("UID",uid);
    }
    
    public Usuario select(String sBy,String by) {
    	Connection conn = Conexion.getInstance().checkOut();
        String sql = "SELECT * FROM Usuario WHERE ("+sBy+" = ? ) ";
        PreparedStatement stmt = null;
        ResultSet result = null;
        Usuario u = null;

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, by);
            result = stmt.executeQuery();

            result.next();
            
            double loc[] = new double[2];
            loc[0] = result.getDouble("lat");
            loc[1] = result.getDouble("lon");
            
            u = new Usuario();
            u.setUid(result.getString("UID"));
            u.setNombre(result.getString("nombre"));
            u.setApellidos(result.getString("apellidos"));
            u.setFechaNacimiento(result.getString("fechaNacimiento"));
            u.setSexo(result.getString("sexo").charAt(0));
            u.setDireccion(result.getString("direccion"));
            u.setEmail(result.getString("email"));
            u.setNacionalidad(result.getString("nacionalidad"));
            u.setLocalizacion(loc);
            u.setApodo(result.getString("apodo"));
            u.setPass(result.getString("pass"));
            
        } catch (SQLException e) {
            System.out.println("Mensaje de error: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("Código de error: " + e.getErrorCode());
        } finally {
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }

        return u;
    }
    
    /*public List<Usuario> selectAll() {
        Connection conn = Conexion.getInstance().checkOut();

        PreparedStatement stmt = null;
        List<Usuario> resultado=new LinkedList<Usuario>();
        ResultSet result=null;

        try {

            String sql = "SELECT * FROM Usuario";
            stmt = conn.prepareStatement(sql); 
            stmt.executeQuery();
            result = stmt.executeQuery();

            while (result.next()){
                Usuario temp = new Usuario();
                double loc[] = new double[2];
                loc[0] = result.getDouble("lat");
                loc[1] = result.getDouble("lon");
                temp.setUid(result.getString("uid"));
                temp.setApodo(result.getString("apodo"));
                temp.setLocalizacion(loc);
                
                resultado.add(temp);
            }
        } catch (SQLException e) {
            System.out.println("Mensaje de error: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("Código de error: " + e.getErrorCode());
        } finally {
            Conexion.getInstance().checkIn(conn);
            try {
                if (result != null)
                    result.close();
                if (stmt != null)
                    stmt.close();
            } catch (SQLException e) {
            }

        }
        return resultado;
    }*/
    public List<Usuario> selectAll(){
    	System.out.println("Entramos en JDBCUsuarioDAO.selectAll");
    	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	List<Usuario> resultado=new LinkedList<Usuario>();
    	resultado=session.createQuery("from Usuario").list();
    	session.getTransaction().commit();
    	return resultado;
    }

}
